#pragma once

#include "task_base.h"
#include "application/vehicle/vehicle_service.h"
#include <memory>
#include <string>
#include <chrono>

namespace application {
namespace task {

/**
 * @brief 顶升任务 - AGV顶升机构控制
 * @details 对应三方代码中的 TaskJack
 *          使用 VehicleService 进行顶升控制
 */
class JackTask : public SubTaskBase {
public:
    /**
     * @brief 构造函数
     * @param raise 是否上升（true=上升，false=下降）
     * @param vehicleService 车辆服务
     * @param logger 日志记录器
     * @param operationStation 操作站点（可选，用于验证位置）
     * @param waitTimeSeconds 等待时间（秒），默认6秒
     */
    JackTask(
        bool raise,
        std::shared_ptr<vehicle::VehicleService> vehicleService,
        std::shared_ptr<kernel::ILogger> logger,
        const std::string& operationStation = "",
        int waitTimeSeconds = 6
    );

    ~JackTask() override = default;

    // SubTaskBase 接口实现
    kernel::task::TaskStage init(TaskContext& ctx) override;
    kernel::task::TaskStage run(TaskContext& ctx) override;
    kernel::task::TaskStage cleanup(TaskContext& ctx) override;

    kernel::task::TaskType getType() const override {
        return kernel::task::TaskType::Jack;
    }

    std::string getDescription() const override {
        return std::string("Jack control: ") + (m_raise ? "raise" : "lower");
    }

private:
    // 是否上升
    bool m_raise;

    // 车辆服务
    std::shared_ptr<vehicle::VehicleService> m_vehicleService;

    // 操作站点（可选，用于验证AGV是否在正确位置）
    std::string m_operationStation;

    // 等待时间（秒）
    int m_waitTimeSeconds;

    // 顶升命令是否已发送
    bool m_commandSent{false};

    // 命令发送时间
    std::chrono::system_clock::time_point m_commandTime;

    /**
     * @brief 检查等待时间是否已过
     * @return 是否超时
     */
    bool isWaitTimeElapsed() const;
};

} // namespace task
} // namespace application
